package slcu.inscripcion;

import java.io.IOException;
import java.util.Date;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletSession;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

import slcu.DeportistaAlreadyApprovedException;
import slcu.DeportistaAlreadyEnabledException;
import slcu.DeportistaAlreadyRegisteredException;
import slcu.NoSuchAlumnoException;
import slcu.NoSuchDeportistaException;
import slcu.NoSuchInscripcionMensajeException;
import slcu.NoSuchPartidoException;

import slcu.eventos.controllers.EventoDisciplinaController;
import slcu.eventos.controllers.EventoDisciplinaControllerFactory;

import slcu.model.Alumno;
import slcu.model.CategoriaDisciplina;
import slcu.model.Deportista;
import slcu.model.Partido;

import slcu.service.AlumnoLocalServiceUtil;
import slcu.service.CategoriaDisciplinaLocalServiceUtil;
import slcu.service.DeportistaLocalServiceUtil;
import slcu.service.InscripcionDisciplinaLocalServiceUtil;
import slcu.service.InscripcionLocalServiceUtil;
import slcu.service.InscripcionMensajeLocalServiceUtil;
import slcu.service.PartidoLocalServiceUtil;
import slcu.solicitudaltaalumno.SolicitudAltaAlumnoPortlet;

import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.User;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;

/**
 * Portlet implementation class Inscripcion
 */
public class Inscripcion extends MVCPortlet {
	
	private static Log _log = LogFactoryUtil.getLog(Inscripcion.class);
	
	private static String registracionDeportistaJSP = "/html/inscripcion/registracion.jsp";
	private static String inscripcionDeportistaJSP = "/html/inscripcion/inscripcion.jsp";
	
	private SolicitudAltaAlumnoPortlet solicitudAltaAlumnoPortlet = new SolicitudAltaAlumnoPortlet();
	
	public void registrarDeportista(ActionRequest request, ActionResponse response) throws SystemException, PortalException {

		response.setRenderParameter("jspPage", registracionDeportistaJSP);

		ThemeDisplay td = (ThemeDisplay)request.getAttribute(WebKeys.THEME_DISPLAY);
		User user = td.getUser();
		
		String dni = request.getParameter("dni");
		Boolean prevApproved = ParamUtil.get(request, "prevApproved", false);
		Boolean volverARegistrar = ParamUtil.get(request, "volverAPendiente", false);
		String comment = ParamUtil.get(request, "comment", "");

		Alumno alumno = null;
		try {
			alumno = AlumnoLocalServiceUtil.getFirstByDNI(dni);
		} catch (NoSuchAlumnoException e) {
			SessionErrors.add(request, "alumno-not-found");
			return;
		}
		
		if (volverARegistrar && !DeportistaLocalServiceUtil.estaRechazado(dni)) {
			SessionErrors.add(request, "deportista-not-rejected");
			return;
		}
		
		try {
			DeportistaLocalServiceUtil.registrarDeportista(alumno, user, prevApproved, true);
			SessionMessages.add(request, "deportista-updated-successfully");
		} catch (DeportistaAlreadyRegisteredException e) {
			// El Profesor vuelve el deportista a Pendiente de Inscripcion
			Deportista deportista = DeportistaLocalServiceUtil.getFirstByDNI(dni);
			if (deportista == null) {
				_log.error("No se encontro el deportista: "+ dni);
				SessionErrors.add(request, "system-error");
				return;
			} else if (deportista.getInscripcionStatus() == InscripcionStatus.STATUS_REGISTERED){
				SessionErrors.add(request, "deportista-already-registered");
			} else if (deportista.getInscripcionStatus() == InscripcionStatus.STATUS_REJECTED && !volverARegistrar || comment.isEmpty()) {
				SessionErrors.add(request, "deportista-rejected-needs-comment");
			} else {
				User prevUser = UserLocalServiceUtil.fetchUser(deportista.getInscripcionStatusByUserId());
				Deportista newDeportista = DeportistaLocalServiceUtil.volverARegistrar(deportista, comment, user);
				InscripcionEvents.onReinscripcion(user, prevUser, newDeportista);
				SessionMessages.add(request, "deportista-updated-successfully");
			}
		} catch(Exception e) {
			_log.trace("Error Registrando el deportista, DNI: " + dni, e);
			SessionErrors.add(request, "system-error");			
		}
		
		if (!SessionErrors.isEmpty(request)) {
			PortalUtil.copyRequestParameters(request, response);
		}
		
	}
	
	public void desregistrar(ActionRequest request, ActionResponse response) {
		
		response.setRenderParameter("jspPage", registracionDeportistaJSP);
		ThemeDisplay td = (ThemeDisplay)request.getAttribute(WebKeys.THEME_DISPLAY);
		User user = td.getUser();
		
		Long deportistaId = ParamUtil.getLong(request, "deportistaId");
		
		Deportista deportista = null;
		try {
			deportista = DeportistaLocalServiceUtil.getDeportista(deportistaId);
		} catch (PortalException e) {
			SessionErrors.add(request, "deportista-not-found");
			return;
		} catch (SystemException e) {
			SessionErrors.add(request, "deportista-not-found");
			return;
		}		
		
		if (deportista == null) {
			SessionErrors.add(request, "deportista-not-found");
			return;
		}
		
		if (deportista.getInscripcionStatus() != InscripcionStatus.STATUS_REGISTERED) {
			SessionErrors.add(request, "deportista-no-registrado");
			return;
		}
		
		if (deportista.getInscripcionStatusByUserId() != user.getUserId()) {
			SessionErrors.add(request, "usuario-sin-permiso");
			return;
		}
		
		try {
			DeportistaLocalServiceUtil.desregistrarDeportista(deportista, user);
		} catch (SystemException e) {
			SessionErrors.add(request, "error-al-desregistrar");
			return;
		}
		
		SessionMessages.add(request, "deportista-unregistered");
		
	}
	
	public void habilitarDeportista(ActionRequest request, ActionResponse response) {

		response.setRenderParameter("jspPage", inscripcionDeportistaJSP);

		ThemeDisplay td = (ThemeDisplay)request.getAttribute(WebKeys.THEME_DISPLAY);
		User user = td.getUser();
		
		String dni = request.getParameter("dni");
		Boolean enable = ParamUtil.getBoolean(request, "enable", false);

		Deportista deportista = null;
		try {
			deportista = DeportistaLocalServiceUtil.getFirstByDNI(dni);
			if (enable) {
				DeportistaLocalServiceUtil.habilitarDeportista(deportista, user);
			} else {
				String comment = ParamUtil.getString(request, "comment");
				User prevUser = UserLocalServiceUtil.fetchUser(deportista.getInscripcionStatusByUserId());
				Deportista newDeportista = DeportistaLocalServiceUtil.rechazarDeportista(deportista, comment, user);				
				InscripcionEvents.onRechazo(user, prevUser, newDeportista);
			}
		} catch (NoSuchDeportistaException e) {
			SessionErrors.add(request, "deportista-not-found");			
		} catch (DeportistaAlreadyEnabledException e) {
			SessionErrors.add(request, "deportista-already-enabled");
		} catch (PortalException e) {
			_log.trace("Error habilitando al deportista, DNI: " + dni, e);
			SessionErrors.add(request, "system-error");
		} catch(SystemException e) {
			_log.trace("Error habilitando al deportista, DNI: " + dni, e);
			e.printStackTrace();
			SessionErrors.add(request, "systemg-error");			
		}
		
		if (SessionErrors.isEmpty(request) && deportista != null) {
			try {
				InscripcionMensajeLocalServiceUtil.invalidate(InscripcionMensajeTypes.DEPORTISTA_REINSCRIPCION, deportista);
			} catch (NoSuchInscripcionMensajeException e) {
				_log.debug(String.format("No se encontro un mensaje de " + 
						   "reinscripcion para el deportista, DNI %s", deportista.getDni()));
			} catch (SystemException e) {
				_log.error(String.format("Hubo un error al intentar invalidar el mensaje de " + 
						   "reinscripcion para el deportista %s", deportista.getDni()));
			}
			SessionMessages.add(request, "deportista-updated-successfully");
		}
		
	}	
	
	public void volverAPendiente(ActionRequest request, ActionResponse response) {
		
		response.setRenderParameter("jspPage", inscripcionDeportistaJSP);
		
		ThemeDisplay td = (ThemeDisplay)request.getAttribute(WebKeys.THEME_DISPLAY);
		User user = td.getUser();
		
		long deportistaId = ParamUtil.getLong(request, "deportistaId");
		Deportista deportista = null;
		
		try {
			deportista = DeportistaLocalServiceUtil.fetchDeportista(deportistaId);
			DeportistaLocalServiceUtil.volverAPendiente(deportista, user);
		} catch (DeportistaAlreadyApprovedException e) {
			SessionErrors.add(request, "deportista-already-approved");
		} catch (PortalException e) {
			SessionErrors.add(request, "invalid-request");
		} catch(Exception e) {
			e.printStackTrace();
			SessionErrors.add(request, "system-error");			
		}
		
		if (SessionErrors.isEmpty(request) && deportista != null) {
			try {
				InscripcionMensajeLocalServiceUtil.invalidate(InscripcionMensajeTypes.DEPORTISTA_REINSCRIPCION, deportista);
			} catch (NoSuchInscripcionMensajeException e) {
				_log.debug(String.format("No se encontro un mensaje de " + 
						   "reinscripcion para el deportista, DNI %s", deportista.getDni()));
			} catch (SystemException e) {
				_log.error(String.format("Hubo un error al intentar revalidar el mensaje de " + 
						   "reinscripcion para el deportista %s", deportista.getDni()));
			}
			SessionMessages.add(request, "deportista-updated-successfully");
		}
		
	}
	
	public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException {
		
		String resource = ParamUtil.getString(request, "resource");
		ResourceController rc = new ResourceController(request, response, getPortletContext());
		
		if (resource.equals("escuelasByRegionCombo")) {
			rc.escuelasByRegionCombo();
		} else if (resource.equals("deportistasPendientesByR_E")) {
			rc.deportistasByRegionEscuelaTable();
		}
		else {
			com.liferay.portal.kernel.captcha.CaptchaUtil.serveImage(request, response);
		}
	}

	
	public void saveEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		slcu.equipos.Equipos.saveEquipo(actionRequest, actionResponse);

	}

	public void asignarDeportistaAEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException, PortalException {

		slcu.equipos.Equipos.asignarDeportistaAEquipo(actionRequest, actionResponse);

	}

	public void quitarDeportistaDeEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		slcu.equipos.Equipos.quitarDeportistaDeEquipo(actionRequest, actionResponse);

	}

	public void eliminarEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		slcu.equipos.Equipos.eliminarEquipo(actionRequest, actionResponse);

	}
	
	public void enviarEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		slcu.equipos.Equipos.enviarEquipo(actionRequest, actionResponse);
	}

	public void desenviarEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		slcu.equipos.Equipos.desenviarEquipo(actionRequest, actionResponse);

	}

	public void aprobarEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		slcu.equipos.Equipos.aprobarEquipo(actionRequest, actionResponse);

	}

	public void cancelarAprobacionEquipo(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		slcu.equipos.Equipos.cancelarAprobacionEquipo(actionRequest, actionResponse);

	}

	public void savePruebas(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		slcu.equipos.Equipos.savePruebas(actionRequest, actionResponse);

	}

	public void savePuntaje(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		slcu.puntajes.Puntajes.savePuntaje(actionRequest, actionResponse);

	}

	public void eliminarPuntaje(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException, SystemException {

		slcu.puntajes.Puntajes.eliminarPuntaje(actionRequest, actionResponse);

	}

	public void agendarEvento(ActionRequest actionRequest, ActionResponse actionResponse) {
		
		ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		User createUser = themeDisplay.getUser();
		
		Long categoriaId = ParamUtil.getLong(actionRequest, "categoriaId");
		CategoriaDisciplina categoriaDisciplina = null;
		try {
			categoriaDisciplina = CategoriaDisciplinaLocalServiceUtil.getCategoriaDisciplina(categoriaId);
		} catch (Exception e1) {
			categoriaDisciplina = null;
			_log.error("Error al obtener la categoria", e1);
			return; // TODO: Volver a la p�gina anterior
		}
			
		EventoDisciplinaController eventoDisciplinaController;
		try {
			eventoDisciplinaController = EventoDisciplinaControllerFactory.getEventoDisciplinaController(categoriaDisciplina);
		} catch (Exception e) {
			_log.error("No se pudo obtener el Controlador de EventoDisciplina", e);
			return;
		}
		
		eventoDisciplinaController.crearEvento(actionRequest, actionResponse, createUser);
		
	}
	
	public void saveResultado(ActionRequest actionRequest, ActionResponse actionResponse) throws SystemException {
		long partidoId = Long.valueOf(actionRequest.getParameter("partidoId"));
		Partido partido = PartidoLocalServiceUtil.fetchPartido(partidoId);
		
		CategoriaDisciplina categoria = CategoriaDisciplinaLocalServiceUtil.fetchCategoriaDisciplina(partido.getCategoriaId());
		
		long marcador1 = 0, marcador2 = 0;
		
		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		User user = themeDisplay.getUser();

		try {
			marcador1 = Long.valueOf(actionRequest.getParameter("marcador1").trim());
			marcador2 = Long.valueOf(actionRequest.getParameter("marcador2").trim());
		}
		catch (Exception e) {
			SessionErrors.add(actionRequest, "marcador-no-es-numero");
		}
		
		if (actionRequest.getParameter("observaciones") != null &&
				actionRequest.getParameter("observaciones").length() > 200) {
			SessionErrors.add(actionRequest, "observaciones-mayor-200");
		}
		
		actionResponse.setRenderParameter("partidoId", String.valueOf(partidoId));
		actionResponse.setRenderParameter("disciplinaId", String.valueOf(categoria.getDisciplinaId()));
		actionResponse.setRenderParameter("categoriaId", String.valueOf(categoria.getCategoriaId()));
		
		if (!SessionErrors.isEmpty(actionRequest)) {
			actionResponse.setRenderParameter("partidoId", String.valueOf(partidoId));
			actionResponse.setRenderParameter("jspPage", "/html/eventos/cargaResultado.jsp");
			return;
		}

		partido.setModifiedDate(new Date());
		partido.setModifiedUser(user.getUserId());
		partido.setObservaciones(actionRequest.getParameter("observaciones"));
		partido.setMarcador1(marcador1);
		partido.setMarcador2(marcador2);
		
		PartidoLocalServiceUtil.updatePartido(partido);
		
		SessionMessages.add(actionRequest, "resultado-cargado");
		actionResponse.setRenderParameter("jspPage", "/html/eventos/view.jsp");
	}

	public void eliminarPartido(ActionRequest actionRequest, ActionResponse actionResponse) throws SystemException, NoSuchPartidoException {
		String partidoId = actionRequest.getParameter("partidoId");

		Partido partido = PartidoLocalServiceUtil.fetchPartido(Long.valueOf(partidoId));
		CategoriaDisciplina categoria = CategoriaDisciplinaLocalServiceUtil.fetchCategoriaDisciplina(partido.getCategoriaId());

		ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
		User user = themeDisplay.getUser();

		/*
		if (equipo.getCreateUser() != user.getUserId())
			SessionErrors.add(actionRequest, "usuario-creacion-no-coincide");
		
		if (equipo.getEstado() != 0)
			SessionErrors.add(actionRequest, "equipo-no-eliminable");
			

		if (!SessionErrors.isEmpty(actionRequest)) {
			actionResponse.setRenderParameter("equipoId", String.valueOf(equipo.getEquipoId()));
			actionResponse.setRenderParameter("jspPage", "/html/equipos/detail.jsp");
			return;
		}
		*/
		
		PartidoLocalServiceUtil.remove(partido.getPartidoId());
		
		actionResponse.setRenderParameter("disciplinaId", String.valueOf(categoria.getDisciplinaId()));
		actionResponse.setRenderParameter("categoriaId", String.valueOf(categoria.getCategoriaId()));
		
		SessionMessages.add(actionRequest, "partido-eliminado");

		actionResponse.setRenderParameter("jspPage", "/html/eventos/view.jsp");

	}
	
	public void solicitarAltaAlumno(ActionRequest request, ActionResponse response) {
		solicitudAltaAlumnoPortlet.solicitarAltaAlumno(request, response);
	}
	
	public void inscribir(ActionRequest request, ActionResponse response)
			throws NumberFormatException, SystemException {

		if (request.getParameter("accion") != null &&
				request.getParameter("accion").equals("inscribir")) {
			List<Long> listDisciplinaId = new LinkedList<Long>();

			for (String parameter : request.getParameterMap().keySet()) {
				if (parameter.split("_")[0].equals("disciplina")) {
					listDisciplinaId.add(Long.valueOf(
							parameter.split("_")[1]));
				}
 			}

			/*
			 * obtengo el usuario, para loguear quien esta registrado
			 */
			ThemeDisplay themeDisplay = (ThemeDisplay)request.
					getAttribute(WebKeys.THEME_DISPLAY);
			User user = themeDisplay.getUser();
			
			InscripcionDisciplinaLocalServiceUtil.
					registrar(request.getParameter("dni"),
					Long.valueOf(request.getParameter("cue")),
					Integer.valueOf(request.getParameter("nivel")),
					listDisciplinaId,
					user.getUserId());

			SessionMessages.add(request, "inscripcion-realizada");
		}

		response.setRenderParameter("dni", request.getParameter("dni"));

		if (request.getParameter("cue") != null)
			response.setRenderParameter("cue", request.getParameter("cue"));

		response.setRenderParameter("jspPage",
				"/html/inscripcion/inscripcion.jsp");
	}
	
}
